#include "tos_k.h"
#include <stdio.h>

#define STK_SIZE_TASK_ODD       512
#define STK_SIZE_TASK_EVEN      512

k_stack_t stack_task_odd[STK_SIZE_TASK_ODD];
k_stack_t stack_task_even[STK_SIZE_TASK_EVEN];

k_task_t task_odd;
k_task_t task_even;

k_mutex_t print_mutex;  // 互斥锁，用于保护 printf 函数的输出

volatile int current_number = 1;  // 全局变量，用于记录当前的数值

void task_odd_entry(void *arg)
{
    while (1) {
        tos_mutex_pend(&print_mutex);  // 获取互斥锁
        
        if (current_number % 2 != 0) {
            printf("Odd:  %d\n", current_number);
            current_number++;
        }

        tos_mutex_post(&print_mutex);  // 释放互斥锁
        tos_task_delay(100);  // 延时一段时间，让出CPU时间片
    }
}

void task_even_entry(void *arg)
{
    while (1) {
        tos_mutex_pend(&print_mutex);  // 获取互斥锁
        
        if (current_number % 2 == 0) {
            printf("Even: %d\n", current_number);
            current_number++;
        }

        tos_mutex_post(&print_mutex);  // 释放互斥锁
        tos_task_delay(100);  // 延时一段时间，让出CPU时间片
    }
}

int main(void)
{
   osKernelInitialize(); //TOS Tiny kernel initialize
    
    // 创建互斥锁
    tos_mutex_create(&print_mutex);
    
    // 创建任务
    tos_task_create(&task_odd, "Task Odd", task_odd_entry, NULL, 3,
                    stack_task_odd, STK_SIZE_TASK_ODD, 0);
    
    tos_task_create(&task_even, "Task Even", task_even_entry, NULL, 3,
                    stack_task_even, STK_SIZE_TASK_EVEN, 0);
    
    // 启动 TobudOS 内核
    tos_knl_start();
    
    // 主函数不会返回，这里可以不加死循环
    return 0;
}
